<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
namespace Agp\CoreBundle\Manager;

use Doctrine\ORM\EntityManager;
use Agp\CoreBundle\Entity\TerminalEmpresa;
use Agp\CoreBundle\Entity\Terminal;
use Agp\CoreBundle\Manager\BaseManager;
use Agp\CoreBundle\Entity\TerminalEmpresaConfig;
use Agp\CoreBundle\Entity\EventoTerminalEmpresa;
/**
 * Description of TerminalEmpresaManager
 *
 * @author bondcs
 */
class TerminalEmpresaManager extends BaseManager{
    
    public function persist($entity) {

        parent::persist($entity);
        
        $config = new TerminalEmpresaConfig;
        $config->setTerminalEmpresa($entity);
        $config->setTipo(TerminalEmpresaConfig::TP_PAD);

        $this->em->persist($config);
        $this->em->flush();
        
    }
    
    
    public function ativar($entity)
    {
        
        $terminal = $entity->getTerminal();
        
        if ($terminal->getTerminalVinculoAtivo()){
                $this->desativar($terminal->getTerminalVinculoAtivo());
        }
        
        $entity->setSituacao(TerminalEmpresa::SIT_ATIVO);
        $terminal->setSituacao(Terminal::SIT_ALUGADO); 
        $this->update($entity);
        return true;
    }
    
    public function desativar($entity)
    {
        
        $terminal = $entity->getTerminal();
        $entity->setSituacao(TerminalEmpresa::SIT_INATIVO);
        $terminal->setSituacao(Terminal::SIT_DISPONIVEL);;
        $this->update($entity);
        return true;
    }
    
    public function updateLiberacao($entity, $dt){
        $versão = substr($entity->getTerminal()->getVersaoSistema(), 0, 1);
        switch ($versão){
            case '1':
                $this->updateLiberacaoVersao3($entity, $dt);
                break;
            case '2':
                $this->updateLiberacaoVersao3($entity, $dt);
                break;
            case '3':
                $this->updateLiberacaoVersao3($entity, $dt);
                break;
            case '4':
                $this->updateLiberacaoVersao4($entity, $dt);
                break;
            case '5':
                $this->updateLiberacaoVersao5($entity, $dt);
                break;
            default:
                $this->updateLiberacaoVersao4($entity, $dt);
                break;
        }
        
        
    }
    
    public function updateLiberacaoVersao3($entity, $dt)
    {
        $utils = $this->container->get("admin.utils");
        if (is_string($dt)){
            $dt = new \DateTime($utils->conv_data_to_us($dt));
        }
        $dt_fim = $dt->format('Y-m-d'); //data final de utilizacao do terminal
        $serial = $entity->getTerminal()->getNoSerie(); //numero de série
        $hoje = new \DateTime("-1 days");
        $Ordem = array(9,0,8,1,7,2,6,3,5,4);

        $Inicio = '2012-01-03';
        $Inicio = explode("-",$Inicio); 
        $Inicio = mktime(0,0,0,$Inicio[1],$Inicio[2],$Inicio[0]);
        $Hoje = mktime(0,0,0,date("m"),date("d"),date("Y"));
        $Dias = ($Hoje - $Inicio)/86400;
        $Dias = ceil($Dias)-1;

        $DtFinal = explode("-",$dt_fim); 
        $DtFinal = mktime(0,0,0,$DtFinal[1],$DtFinal[2],$DtFinal[0]);
        $DiasUtilizacao = ($DtFinal - $Hoje)/86400;
        $DiasUtilizacao = ceil($DiasUtilizacao);

        $Aux = str_replace('-','',$serial);
        $soma = (int)substr($Aux,0,3) + (int)substr($Aux,3,3) + (int)substr($Aux,6,3);
        $S = str_pad($DiasUtilizacao+25,3,'0',STR_PAD_LEFT);
        $S .= str_pad($soma,4,'0',STR_PAD_LEFT);
        $S .= str_pad($Dias,3,'0',STR_PAD_LEFT);
        $Serial = '0000000000';
        for ($I = 0; $I <= 9; $I++) {
            $Serial[$Ordem[$I]] = $S[$I];
        }
        
        $entity->setLiberacao($Serial);
        $entity->setDtLiberacao($hoje);
        $entity->setDtInicio($hoje);
        $entity->setDtTermino($dt);
        $this->update($entity);
        
    }
    
    public function updateLiberacaoVersao4($entity, $dt)
    {
        $utils = $this->container->get("admin.utils");
        if (is_string($dt)){
            $dt = new \DateTime($utils->conv_data_to_us($dt));
        }
        $hoje = new \DateTime("-1 days");
        
        //002
        $terminal = str_pad($entity->getTerminal()->getCodTerminalNoPad(), 3, '0', STR_PAD_LEFT);
        
        //002D
        $terminalCod = $terminal.$utils->CalculaMOD10($terminal);
        
        //131001
        $dtInicial = $hoje->format("ymd");
        $diff = $dt->diff($hoje);
        
        //029
        $dias = str_pad(($diff->days+2), 3, '0', STR_PAD_LEFT);
        
        //002D131001029
        $senha = $terminalCod.$dtInicial.$dias;
        
        
        //002D131001029D
        $senhaCod = $senha.$utils->CalculaMOD10($senha);
        //var_dump($senhaCod);
        $serial = '';
        for ( $i=0; $i < strlen($senhaCod); $i++ ) {
            $serial .= dechex(($senhaCod[$i] + 48) + ($i+1) * 9);
        }
        
        $entity->setLiberacao($serial);
        $entity->setDtLiberacao($hoje);
        $entity->setDtInicio($hoje);
        $entity->setDtTermino($dt);
        $this->update($entity);
        
        
    }
    
    public function updateLiberacaoVersao5($entity, $dt)
    {
        $utils = $this->container->get("admin.utils");
        $serial = $entity->getTerminal()->getNoSerieSerial();
        $codTerminal = $entity->getTerminal()->getCodTerminal();
        
        if (is_string($dt)){
            $dt = new \DateTime($utils->conv_data_to_us($dt));
        }
        
        $data = $dt->format("Ymd");
        $hoje = new \DateTime;
        
        $str = $serial.$codTerminal.$data;

        $codigo = $str.$utils->CalculaMOD10($str);
        
        $liberacao = $utils->criptografa($codigo, 20, FALSE);
        
        $entity->setLiberacao($liberacao);
        $entity->setDtLiberacao($hoje);
        $entity->setDtInicio($hoje);
        $entity->setDtTermino($dt);
        $this->update($entity);
    
    }
    
    public function getSenhaSupervisor($data){
       
        $terminal = $data['terminal'];
        $codigo = $data['codigo'];
        $tresdigitos = substr($terminal->getTerminal()->getNoSerie(), 8, 3);
        //var_dump(intval($codigo / 3));
        //((Resultado * (Resultado / 3)) + str2int(Variaveis.Serialshort)) * (Variaveis.Codigo + 1);
        
        
        //(tmpInt / 2) + Variaveis.Serialshort + CodigoTerminal + 1
        $result = ($codigo / 2) + $tresdigitos + $terminal->getTerminal()->getCodTerminalNoPad() + 1;
        return $result;
    }
    
    public function addEvento($eventos, $terminal, $atendente = null){
        
        $eventosTerminalEmpresa = $terminal->getEventos();
        
        if ($atendente == null){
            if (!$eventosTerminalEmpresa->isEmpty())
                $atendente = $eventosTerminalEmpresa->get(0)->getAtendente();
            else
                $atendente = null;
        }
       
        foreach ($eventos as $evento)
        {   
            $eventoExistente = $terminal->hasEvento($evento);
            if (!$eventoExistente){
                $eventoTerminalEmpresa = new EventoTerminalEmpresa;
                $eventoTerminalEmpresa->setTerminalEmpresa($terminal);
                $eventoTerminalEmpresa->setEvento($evento);
                $eventoTerminalEmpresa->setAtendente($atendente);
                $this->em->persist($eventoTerminalEmpresa);
                
            }else{
                $eventoExistente->setAtendente($atendente);
                $this->em->merge($eventoExistente);
            }
            
            $this->em->flush();
        }
    }
    
    public function removerEvento($terminal, $codEvento){
        
        foreach ($terminal->getEventos() as $eventoTerminalEmpresa){
             if ($eventoTerminalEmpresa->getEvento()->getCodEvento() == $codEvento){
                 $this->remove($eventoTerminalEmpresa);
             }
        }
        
        $this->container->get('agp.habilitaProdutoTerminal.repository')->clearByTerminalAndByEvento($terminal, $codEvento);
        
    }
}

?>
